#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>



//int g_val = 100;
//int main()
//{
//  pid_t id = fork();
//  if (id == 0)
//  {
//    int cnt = 5;
//    // 子进程
//    while (1)
//    {
//      printf("i am child, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
//      sleep(1);
//      if (cnt) cnt--;
//      else
//      {
//        g_val = 200;
//        printf("子进程change g_val: 100->200\n");
//        cnt--;
//      }
//    }
//  }
//  else
//  {
//    // 父进程
//    while (1)
//    {
//      printf("i am parent, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
//      sleep(1);
//    }
//  }
//
//  return 0;
//}



int g_val_1;
int g_val_2 = 100;

int main(int argc, char* argv[], char* env[])
{
  printf("code addr: %p\n", main);
  const char* str = "hello bit";
  printf("read only string addr: %p\n", str);
  printf("init global value addr: %p\n", &g_val_2);
  printf("uninit global value addr: %p\n", &g_val_1);
  char* mem = (char*)malloc(100);
  char* mem1 = (char*)malloc(100);
  char* mem2 = (char*)malloc(100);
  printf("heap addr: %p\n", mem); 
  printf("heap addr: %p\n", mem1); 
  printf("heap addr: %p\n", mem2);

  printf("stack add: %p\n", &str);
  printf("stack add: %p\n", &mem);
  static int a;
  int b;
  int c;
  printf("a = stack add: %p\n", &a);
  printf("stack add: %p\n", &b);
  printf("stack add: %p\n", &c);

  int i = 0;
  for (; argv[i]; i++)
  {
    printf("argv[%d]: %p\n", i, argv[i]);
  }

  for (i = 0; env[i]; i++)
  {
    printf("env[%d]: %p\n", i, env[i]);
  }
  return 0;
}


